package controllers;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import jobs.NotificationJob;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import models.Enseignant;
import models.Formation;
import models.Intervention;
import models.Student;
import models.User;
import play.cache.Cache;
import play.data.validation.Required;
import play.jobs.OnApplicationStart;
import play.mvc.Before;
import play.mvc.Controller;
import play.mvc.results.RenderText;
import utils.Classement;
import utils.ControlData;
import utils.POIExcelReader;
import utils.test;

public class Interventions extends Controller {

	public static List<Formation> listFormationToUpdate = null;
	static Map<Integer, List<String>> dataFromExcel;
	static int i;

	@Before
	public static void onStart() {
		if(Cache.get("user") == null || session.get("user_id") == null){
			Cache.clear();
			session.clear();
			Application.index();
		}
		listFormationToUpdate = Formation.find("order by libelleFormation")
				.fetch();
	}
	
	public static void itv_import_request(){
		render();
	}
	
	public static void getDataFromExcel(@Required File uploadFile){
		POIExcelReader fileReading = new POIExcelReader();
		dataFromExcel = fileReading.getDataFromExcel(uploadFile);
		new NotificationJob(dataFromExcel).now();
		renderText(String.valueOf(dataFromExcel.size()));
	}
	
//	public static void getDataErreursFromExcel(){
//		boolean existError = false;
//		for(int i = 1; i <= dataFromExcel.size(); i++){
//			List<String> dataLine = dataFromExcel.get(i);
//			String erreurs = null;
//			try {
//				erreurs = POIExcelReader.checkDataRecovered(dataLine);
//				Thread.sleep(2000);
//				new NotificationJob(erreurs).doReportErrorJob();
////				MyWebSocket.liveStream.publish(erreurs);
//			} catch (IOException e) {
//				e.printStackTrace();
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			} 
//				if(!erreurs.isEmpty())
//					existError = true;
//		}
//		if(!existError){
//			Enseignant createdBy = (Enseignant) Cache.get("user");
//			
//			for(List<String> dataLine : dataFromExcel.values()){
//				Formation formationRecovered = null;
//				for(Formation formation : listFormationToUpdate){
//					if(formation.libelleFormation.compareToIgnoreCase(dataLine.get(2)) == 0)
//						formationRecovered = formation;
//				}
//				Intervention interventionToCreate = new Intervention(dataLine.get(0), dataLine.get(1), ControlData.parseToDate(dataLine.get(4)), 
//						ControlData.parseToDate(dataLine.get(3)), Integer.valueOf(dataLine.get(5)), formationRecovered, createdBy);
//				interventionToCreate.createdAt = new Date();
////				interventionToCreate.save();
//			}			
//		}
			
//	}

	/**
	 * Méthode permettant d'afficher le détail d'un cour
	 * 
	 * @param id
	 *            de l'intervention
	 * @param subject
	 *            de l'intervention
	 */
	public static void itv_display_request(Long id, String subject) {
		Intervention interventionToDisplay = Intervention.findById(id);
		interventionToDisplay.setMoyenneIntervention(Classement
				.getMoyenneGeneraleForIntervention(interventionToDisplay));
		interventionToDisplay.setMoyenneGeneraleAllCritere(Classement
				.getMapMoyenneAllCritere(interventionToDisplay));
		render(interventionToDisplay, listFormationToUpdate);
	}

	/**
	 * Méthode permettant d'afficher l'avatar d'un user dans un template
	 * 
	 * @param id
	 *            de l'user
	 * @throws IOException
	 */
	public static void image(Long id) throws IOException {
		User u = User.findById(id);
		response.setContentTypeIfNotSet(u.avatarPathUser.type());
		renderBinary(u.avatarPathUser.get());
	}

	/**
	 * Méthode permettant l'affichage de la liste des cours
	 */
	public static void itv_all_request() {
		List<Intervention> listIntervention = null;

		if (session.get("user_statut").equalsIgnoreCase("student")) {

			Student s = (Student) Cache.get("user");
			listIntervention = Intervention.find("byFormationIntervention",
					s.formationStudent).fetch();

		} else if (session.get("user_statut").equalsIgnoreCase("enseignant")) {
			List<Formation> listFormation = Formation.find(
					"order by libelleFormation").fetch();
			Enseignant e = (Enseignant) Cache.get("user");
			listIntervention = Intervention.find(
					"enseignantIntervention like ? order by createdAt desc", e)
					.fetch();
			renderArgs.put("listFormation", listFormation);

		}

		for (Intervention i : listIntervention) {
			i.getStatutIntervention();
		}

		render(listIntervention, listFormationToUpdate);
	}

	/**
	 * Méthode permettant de créer un cours en base de données
	 * 
	 * @param i
	 *            intervention à créer
	 */
	public static void create(Intervention i) {
		if (validation.hasErrors()) {
			flash.error(
					"Veuillez vérifier que tous les champs obligatoires sont complétés",
					"");
			itv_all_request();
		}
		i.createdAt = new Date();
		i.save();
		flash.success("Cours enregistré avec succés", "");
		itv_all_request();
	}
	
	/**
	 * Méthode permettant de créer un cours en base de données
	 * 
	 * @param i
	 *            intervention à créer
	 */
	public static void importInterventions(/*@Required File uploadFile*/) {
//		Enseignant createdBy = (Enseignant) Cache.get("user");
//	
//		POIExcelReader fileReading = new POIExcelReader();
//		fileReading.displayFromExcel(uploadFile);
//		fileReading.checkDataRecovered();		
//		
//		if (fileReading.erreurFile.isEmpty()){
//			for(List<String> dataLine : fileReading.dataRecovered.values()){
//				Formation formationRecovered = null;
//				for(Formation formation : listFormationToUpdate){
//					if(formation.libelleFormation.compareToIgnoreCase(dataLine.get(2)) == 0)
//						formationRecovered = formation;
//				}
//				Intervention interventionToCreate = new Intervention(dataLine.get(0), dataLine.get(1), ControlData.parseToDate(dataLine.get(4)), 
//						ControlData.parseToDate(dataLine.get(3)), Integer.valueOf(dataLine.get(5)), formationRecovered, createdBy);
//				interventionToCreate.createdAt = new Date();
//				interventionToCreate.save();
//			}
//		}
		i++;
		System.out.println(i);
	}

	/**
	 * Méthode permettant de supprimer un cours de la base de données
	 * 
	 * @param id
	 *            de l'intervention à supprimer
	 */
	public static void delete(String[] id) {

		for (String i : id) {
			Intervention interventionToDel = Intervention.findById(Long
					.parseLong(i));
			interventionToDel.delete();
		}

	}
	
	public static void getGabaritExcel(){
		String xlsPath = "Gabarit_import.xls";
		int size = listFormationToUpdate.size();
		String[] listLibelleFormation = new String[size];
		for(int i = 0; i < listFormationToUpdate.size(); i++){
			listLibelleFormation[i] = listFormationToUpdate.get(i).libelleFormation;
		}
		test.create(listLibelleFormation, xlsPath);
		File gabarit = new File(xlsPath);
		renderBinary(gabarit);
	}

	public static void exportExcel() {
		File file = null;
		FileOutputStream outputStream = null;
		Student s = (Student) Cache.get("user");
		List<Intervention> listToExport = Intervention.find(
				"byFormationIntervention", s.formationStudent).fetch();

		try {
			file = new File("Export.xls");
			outputStream = new FileOutputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		Workbook workbook = new HSSFWorkbook();
		Sheet sheet = workbook.createSheet();
		Row header = sheet.createRow(0);
		header.createCell(0).setCellValue("Sujet");
		header.createCell(1).setCellValue("Enseignant");
		header.createCell(2).setCellValue("Début");

		int i = 1;
		for (Intervention interventionToExport : listToExport) {
			interventionToExport.getStatutIntervention();
			Row newRow = sheet.createRow(i);
			newRow.createCell(0).setCellValue(
					interventionToExport.subjectIntervention);
			newRow.createCell(1)
					.setCellValue(
							interventionToExport.enseignantIntervention.lastNameUser
									+ " "
									+ interventionToExport.enseignantIntervention.firstNameUser);
			newRow.createCell(2).setCellValue(
					interventionToExport.endDateIntervention.toString());
			i++;
		}

		try {
			workbook.write(outputStream);
			outputStream.close();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		renderBinary(file);

	}

}
